/**
 * <pre>
 * 紫光软件系统有限公司广电事业部
 * Copyright (C): 2010
 * 
 * 文件名称：
 * DateUtil.java
 * 
 * 文件描述:
 * 日期处理类-获取指定日期。
 * 
 * Notes:
 * 
 * 
 * 修改历史(作者/日期/改动描述):
 * 杨飞宇/2010-09-16/添加转换日期格式的方法（yyyyMMddHHmmss）。
 * 王彬 /2010-08-27/添加转换日期格式的方法。
 * 赵旺 /2010-08-11/初始化。
 * </pre>
 */
package com.unis.iptv.common.utils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

public class DateUtil {
	public static SimpleDateFormat YEAR_MONTH_DAY_TIME_FORMATER = new SimpleDateFormat(
			"yyyyMMddHHmmss");
	public static SimpleDateFormat DATE_AND_TIME_WY_FORMATER = new SimpleDateFormat(
			"yyyyMMddHH:mm:ss");
	public static SimpleDateFormat DATE_AND_TIME_FORMATER = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");
	private static SimpleDateFormat sdf = new SimpleDateFormat();
	public static SimpleDateFormat YEAR_MONTH_DAY_FORMATER = new SimpleDateFormat(
			"yyyy-MM-dd");
	public static SimpleDateFormat DAO_YEAR_MONTH_DAY_FORMATER = new SimpleDateFormat(
			"yyyy.MM.dd");
	public static SimpleDateFormat NEW_YEAR_MONTH_DAY_FORMATER = new SimpleDateFormat(
			"yyyyMMdd");
	
	public static SimpleDateFormat MONTH_DAY_FORMATER = new SimpleDateFormat(
			"MM月dd日");
	
	public static SimpleDateFormat YEAR_MONTH_FORMATER = new SimpleDateFormat(
			"yyyy年MM月");
	
	public static String formatYearMonthDayTime(Date date) {
		try {
			return YEAR_MONTH_DAY_TIME_FORMATER.format(date);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			return null;
		}
	}
	
	/**
	 * 字符串转换成Timestamp
	 * 
	 * @param date
	 *            日期字符串 格式为：yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static Timestamp dateStringToTimestamp(String date) {
		try {
			return new Timestamp(DATE_AND_TIME_FORMATER.parse(date).getTime());
		} catch (ParseException e) {
			return null;
		}
	}
	
	/**
	 * 字符串转换成Timestamp
	 * 
	 * @param date
	 *            日期字符串 格式为：yyyyMMddHHmmss
	 * @return
	 */
	public static Timestamp dateStringyyyyMMddHHmmSSToTimestamp(String date) {
		try {
			return new Timestamp(YEAR_MONTH_DAY_TIME_FORMATER.parse(date)
					.getTime());
		} catch (ParseException e) {
			return null;
		}
	}
	
	/**
	 * 字符串转换成Timestamp
	 * 
	 * @param date
	 *            日期字符串 格式为：yyyyMMddHH:mm:ss
	 * @return
	 */
	public static Timestamp dateStringToTimestampByYearAndHour(String date,
			String year) {
		try {
			return new Timestamp(DATE_AND_TIME_WY_FORMATER.parse(year + date)
					.getTime());
		} catch (ParseException e) {
			return null;
		}
	}
	
	/***
	 * 字符串转换成Timestamp
	 * 
	 * @author 杨飞宇 @2011-8-10
	 * @param date
	 *            日期字符串 格式为：yyyy-MM-dd
	 * @return
	 */
	public static Timestamp dateStringYMDToTimestamp(String date) {
		try {
			return new Timestamp(YEAR_MONTH_DAY_FORMATER.parse(date).getTime());
		} catch (ParseException e) {
			return null;
		}
	}
	
	/**
	 * 格式化日期为yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 *            要格式化的日期
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String formatDateAndTime(Date date) {
		return DATE_AND_TIME_FORMATER.format(date);
	}
	
	/**
	 * 格式化日期为MM月dd日
	 * 
	 * @param date
	 *            要格式化的日期
	 * @return MM月dd日
	 */
	public static String formatMonthDay(Date date) {
		return MONTH_DAY_FORMATER.format(date);
	}
	
	/**
	 * 格式化日期为yyyy-MM-dd
	 * 
	 * @param date
	 *            要格式化的日期
	 * @return yyyy-MM-dd
	 */
	public static String formatYearMonthDay(Date date) {
		return YEAR_MONTH_DAY_FORMATER.format(date);
	}
	
	/**
	 * yyyy.MM.dd 杨飞宇 2011年8月10日 01:54:06
	 * 
	 * @param date
	 * @return
	 */
	public static String formatDaoYearMonthDay(Date date) {
		return DAO_YEAR_MONTH_DAY_FORMATER.format(date);
	}
	
	/**
	 * 得到某一天的日期字符串（按不同的日期格式）
	 * 
	 * @param num
	 *            与当前日期相差的天数 例如：-1 得到的是昨天的日期 1得到的是明天的日期
	 * @param formatType
	 *            日期的格式：1-'yyyyMMdd' 2-'yyyy-MM-DD'
	 * @return 某一天的日期字符串
	 */
	public static String getYearMonthDay(int num, int formatType) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, num);
		String dateString = null;
		switch (formatType) {
			case 1:
				dateString = NEW_YEAR_MONTH_DAY_FORMATER.format(cal.getTime());
				break;
			case 2:
				dateString = YEAR_MONTH_DAY_FORMATER.format(cal.getTime());
				break;
			default:
				throw null;
		}
		return dateString;
	}
	
	/**
	 * 获取指定天数前的日期的格式化字符串
	 * 
	 * @param days
	 *            指定天数
	 * @return yyyy-MM-dd
	 */
	public static String dayOfBefore(Integer days) {
		Calendar c = Calendar.getInstance();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		c.add(Calendar.DAY_OF_YEAR, -(days));
		return formatter.format(c.getTime());
	}
	
	/**
	 * 获得当天开始时间
	 * 
	 * @author 杨飞宇 @2011-8-10
	 * @return 2011-08-10 00:00:00.615 Timestamp类型
	 */
	public static Timestamp getToday() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return new Timestamp(calendar.getTimeInMillis());
	}
	
	/**
	 * 获取当前时间
	 * 
	 * @author 郑智文 @2012-9-28
	 * @return
	 */
	public static String getTodayTime(SimpleDateFormat simpleDateFormat) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.HOUR_OF_DAY, 0);
		calendar.add(Calendar.MINUTE, 0);
		calendar.add(Calendar.SECOND, 0);
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取当天的日期： 日期格式如下 2009-04-11 00：00：00
	 * 
	 * @return 指定的日期字符串
	 */
	public static String getToday(SimpleDateFormat simpleDateFormat) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取当前日期下月份的第一天
	 * 
	 * @param date
	 *            日期
	 * @return 指定的日期字符串
	 */
	public static String getFirstDayOfCurrentMonth(
			SimpleDateFormat simpleDateFormat) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取当前日期下当前周的第一天日期 “星期一”算是一周的第一天
	 * 
	 * @return 指定的日期字符串
	 */
	public static String getFirstDayOfCurrentWeek(
			SimpleDateFormat simpleDateFormat) {
		Calendar calendar = Calendar.getInstance();
		calendar.setFirstDayOfWeek(Calendar.MONDAY);
		calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取离当前时间多少天以前的日期 如参数为30： 则返回30天之前的日期时间
	 * 
	 * @param day
	 *            指定的天数
	 * @return 指定的日期字符串
	 */
	public static String getBeforeDays(int day,
			SimpleDateFormat simpleDateFormat) {
		Calendar today = Calendar.getInstance();
		today.add(Calendar.DAY_OF_YEAR, -day);
		today.set(Calendar.HOUR_OF_DAY, 0);
		today.set(Calendar.MINUTE, 0);
		today.set(Calendar.SECOND, 0);
		return simpleDateFormat.format(today.getTime());
	}
	
	/**
	 * 获取本年的第一天日期
	 * 
	 * @param simpleDateFormat
	 * @return
	 */
	public static String getFirstDayOfCurrentYear(
			SimpleDateFormat simpleDateFormat) {
		return getFirstDayOfBeforeYear(0, simpleDateFormat);
	}
	
	/**
	 * 获取某一年的第一天日期
	 * 
	 * @param year
	 *            与本年相差的年数
	 * @param simpleDateFormat
	 * @return
	 */
	public static String getFirstDayOfBeforeYear(int year,
			SimpleDateFormat simpleDateFormat) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, -year);
		calendar.set(Calendar.DAY_OF_YEAR, 1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取当前日期下月份的最后一天
	 * 
	 * @param date
	 *            日期格式字符串
	 * @return 获取当前日期下月份的最后一天 格式如下 2009-04-31
	 */
	public static String getFirstMonthDayOfCurrentDay(String date,
			SimpleDateFormat simpleDateFormat) {
		Date d = null;
		Calendar calendar = new GregorianCalendar();
		try {
			d = simpleDateFormat.parse(date);
			calendar.setTime(d);
			calendar.set(Calendar.DAY_OF_MONTH, 1);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return simpleDateFormat.format(calendar.getTime());
	}
	
	/**
	 * 获取当前日期下月份的最后一天
	 * 
	 * @param date
	 *            日期格式字符串
	 * @return 获取当前日期下月份的最后一天 格式如下 2009-04-31
	 */
	public static String getLastMonthDayOfCurrentDay(String date,
			SimpleDateFormat simpleDateFormat) {
		Date d = null;
		Calendar calendar = new GregorianCalendar();
		try {
			d = simpleDateFormat.parse(date);
			calendar.setTime(d);
			calendar.set(Calendar.DATE, 1);
			calendar.roll(Calendar.DATE, -1);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return simpleDateFormat.format(calendar.getTime());
	}
	
	// 判断时间date1是否在时间date2之前
	// 时间格式 2005-4-21 16:16:34
	public static boolean isDateBefore(String date1, String date2) {
		try {
			DateFormat df = DateFormat.getDateTimeInstance();
			return df.parse(date1).before(df.parse(date2));
		} catch (ParseException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	// 判断当前时间是否在时间date2之前
	// 时间格式 2005-4-21 16:16:34
	public static boolean isDateBefore(String date2) {
		try {
			Date date1 = new Date();
			DateFormat df = DateFormat.getDateTimeInstance();
			
			if (date2.indexOf(":") > 0)
				return date1.before(df.parse(date2));
			else
				return date1.before(df.parse(date2 + " 00:00:00"));
			
		} catch (ParseException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	public static synchronized Date parseDateFormat(final String strDate) {
		final String pattern = "yyyy-MM-dd HH:mm:ss";
		return parseDateFormat(strDate, pattern);
	}
	
	public static synchronized Date parseDateFormat(final String strDate,
			final String pattern) {
		synchronized (sdf) {
			Date date = null;
			sdf.applyPattern(pattern);
			try {
				date = sdf.parse(strDate);
			} catch (final Exception e) {
			}
			return date;
		}
	}
	
	public static synchronized String getDateFormat(final java.util.Date date,
			final String pattern) {
		synchronized (sdf) {
			if (null == date)
				return "";
			String str = null;
			sdf.applyPattern(pattern);
			str = sdf.format(date);
			return str;
		}
	}
	
	public static String getFormat(final String strDate, String pattern) {
		
		return getFormat(strDate, "yyyy-MM-dd HH:mm:ss", pattern);
		
	}
	
	/**
	 * 转换日期字符串格式
	 * 
	 * @modifier 赵旺 @2010-8-29
	 * @param strDate
	 *            要转换的日期字符串
	 * @param fromPattern
	 *            转换前的格式，如：YYYYMMDD
	 * @param toPattern
	 *            转换后的格式，如：yyyy-MM-DD
	 * @return
	 */
	public static String getFormat(final String strDate, String fromPattern,
			String toPattern) {
		Date date = parseDateFormat(strDate, fromPattern);
		return getDateFormat(date, toPattern);
		
	}
	
	/**
	 * 两个时间相减得到分钟
	 * 
	 * @param strDate
	 *            后者-前者
	 * @param fromPattern
	 *            转换前的格式，如：YYYYMMDD
	 * @return
	 */
	public static long getCutMinite(Timestamp strDate, Timestamp fromPattern) {
		long timeStart = strDate.getTime();
		long timeEnd = fromPattern.getTime();
		if (timeStart > timeEnd) {
			timeEnd += 1000 * 60 * 60 * 24;
		}
		long date = (timeEnd - timeStart) / 60 / 1000;
		return Math.abs(date);
		
	}
	
	/**
	 * 把HH:mm时间类型 如：23:10转换成
	 * YYYYMMDDHH24MISS
	 * 如：20100712201900
	 * 
	 * @author 杨飞宇 @2012-8-7
	 * @param strHourMinute
	 * @return
	 */
	public static String getFormat(String strHourMinute, int flag) {
		int hour = Integer.parseInt(strHourMinute.substring(0, 2));
		int minute = Integer.parseInt(strHourMinute.substring(3));
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, flag - 2);
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, 0);
		Date date = new Date(calendar.getTimeInMillis());
		return formatYearMonthDayTime(date);
	}
	
	/**
	 * 根据指定日期格式返回当天日期加上前后两天的时间字符串
	 * 
	 * @author 杨飞宇 @Aug 8, 2012
	 * @param pattern
	 * @return
	 */
	public static List<String> getFiveDates(String pattern) {
		List<String> fiveDates = new ArrayList<String>();
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		for (int i = -2; i <= 2; i++) {
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.DAY_OF_MONTH, i);
			fiveDates.add(formatter.format(calendar.getTime()));
		}
		
		return fiveDates;
	}
	
	public static Object formatYearMonthDayyyMMdd(Date date) {
		return NEW_YEAR_MONTH_DAY_FORMATER.format(date);
	}
}
